home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1993 / MacHack 1993.toast / MacHack™ 1987-1992 / MacHack™ '91 / '91 Attendee Contributions / Brian Fitzgerald's Stuff / cperf / src / stderr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-09  |  3.5 KB  |  112 lines  |  [TEXT/KAHL]

  1. /* Provides a useful variable-length argument error handling abstraction.
  2.  
  3.    Copyright (C) 1989 Free Software Foundation, Inc.
  4.    written by Douglas C. Schmidt (schmidt@ics.uci.edu)
  5.  
  6. This file is part of GNU GPERF.
  7.  
  8. GNU GPERF is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 1, or (at your option)
  11. any later version.
  12.  
  13. GNU GPERF is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with GNU GPERF; see the file COPYING.  If not, write to
  20. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22. #include <stdio.h>
  23. #include <stdarg.h>
  24. #include <stdlib.h>
  25. #include <errno.h>
  26. #include <string.h>
  27.  
  28. #include "stderr.h"
  29.  
  30. typedef void    (*PTF)();        /* arbitrary pointer to function type */
  31.  
  32.     /* Holds the name of the currently active program. */
  33.  
  34. static char *    program_name;
  35.  
  36.     /***********************************************************************\
  37.     *                                                                        *
  38.     * name:        set_program_name                                            *
  39.     *                                                                        *
  40.     * descr:    Set the name of the current program.                        *
  41.     *                                                                        *
  42.     \***********************************************************************/
  43.  
  44. void set_program_name( char * prog_name )
  45.     program_name = prog_name;
  46. }
  47.  
  48.  
  49.     /***********************************************************************\
  50.     *                                                                        *
  51.     * name:        report_error                                                *
  52.     *                                                                        *
  53.     * descr:    Report an error using formatted print (same codes as in     *
  54.     *            printf, with a few extensions).                                *
  55.     *                                                                        *
  56.     *            %a : exit the program at this point                            *
  57.     *            %e : call the function                                        *
  58.     *            %n : print the name of the program                            *
  59.     *            %p : print the errno value                                    *
  60.     *                                                                        *
  61.     \***********************************************************************/
  62.  
  63. /* Valid Options (prefixed by '%', as in printf format strings) include:
  64.    'a': exit the program at this point
  65.    'c': print a character
  66.    'd': print a decimal number
  67.    'e': call the function pointed to by the corresponding argument
  68.    'f','g': print a double
  69.    'n': print the name of the program (NULL if not set in constructor or elsewhere)
  70.    'p': print out the appropriate errno value from syserror( errnno )
  71.    's': print out a character string
  72.    '%': print out a single percent sign, '%' */
  73.  
  74. void report_error( char * fmt, ... )
  75. {
  76.     int            sys_nerr = 9999;
  77.     va_list        argp;
  78.     int            abort = 0;
  79.     char *        format;
  80.  
  81.     va_start( argp, fmt );
  82.  
  83.     for ( format=fmt; *format; format++ ) 
  84.     {
  85.         if ( *format != '%' ) 
  86.             putc( *format, stderr );
  87.         else 
  88.         {
  89.             switch( *++format ) 
  90.             {
  91.                 case 'a' : abort = 1; break;
  92.                 case 'c' : putc( va_arg( argp, int ), stderr ); break;
  93.                 case 'd' : fprintf( stderr, "%d", va_arg( argp, int ) ); break;
  94.                 case 'e' : ( *va_arg( argp, PTF ) )(); break;
  95.                 case 'f' : fprintf( stderr, "%g", va_arg( argp, double ) ); break;
  96.                 case 'n' : fputs( program_name ? program_name : "error", stderr ); break;
  97.                 case 'p' : 
  98.                     if ( errno < sys_nerr ) 
  99.                         fprintf( stderr, "%s: %s", va_arg( argp, char * ), strerror( errno ) );
  100.                     else 
  101.                         fprintf( stderr, "<unknown error> %d", errno );
  102.                     break;
  103.                 case 's' : fputs( va_arg( argp, char * ), stderr ); break;
  104.             }
  105.         }
  106.         if ( abort ) 
  107.             exit( 1 );
  108.     }
  109.     va_end( argp );
  110. }
  111.